//============================================================================
// Name        : tpconcu.cpp
// Author      : 
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include "MemoriaCompartida.h"
#include "Compartir.h"

using namespace std;

int main() {

	DatosCompartidos datos;
	MemoriaCompartida<DatosCompartidos> memoria;

	//Creo la memoria compartida.
	int estadoMemoria = memoria.crear ( (char*) "/home/cristian/facu/Concurrentes/ahoraconcu/TextoTPC1.pdf",'R' );

	if ( estadoMemoria == SHM_OK ) {

		/*pid_t procId = fork ();
		if ( procId == 0 ) {*/

			cout << "escribo en la memoria compartida (Padre)" << endl;
			memoria.escribir(datos);
			/*
			// espera a que termine el programa.
			int estado = 0;
			wait ( &estado );
			// libera la memoria
			memoria.liberar ();
			cout << "Libere la memoria"<< endl;

		}*/
	} else {
		cout << "Error en memoria compartida: " << estadoMemoria << endl;
	}

	string aux, comando, argumentos;
	Compartir compartir;

	//Loop principal.
	while (1) {

		cin.getline((char*)aux.c_str(), 1024);
		string leido(aux.c_str());

		cout << "Leido: " << leido << endl;
		if (leido.compare("exit") == 0) {
			break;
		}
		comando = leido.substr(0, leido.find_first_of(" ", 0));
		if (comando.compare("compartir") == 0) {

			pid_t procId = fork ();
			if ( procId == 0 ) {
				cout << "Se ejecuto compartir" << endl;
				argumentos = leido.substr(leido.find_first_of(" ", 0));
				cout << "Argumentos: " << argumentos << endl;

				//Pongo en la memoria compartir el archivo.
				compartir.compartir(argumentos);
				break;
			}
		}

		if (comando.compare("listar") == 0) {
			pid_t procId = fork ();
			if ( procId == 0 ) {
				cout << "Se ejecuto listar" << endl;

				vector<string> d = compartir.listar();
				cout << "cantidad de archivos" << d.size() << endl;
				break;
			}
		}

		cout << comando << endl;

		sleep(2);
	}

	memoria.liberar();

	exit ( 0 );
}
